package ru.spb.nicetu.altx.mnemo.utils.widgets;

import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;

/**
 * Текстовое поле ввода
 */
public class TextFieldComposite extends AFieldComposite {

  //**************************************************************************//
  //                        Enums                                             //
  //**************************************************************************//

  //**************************************************************************//
  //                        Members                                           //
  //**************************************************************************//
  /**
   * собствено, поле ввода
   */
  private Text mText;

  /**
   * модель
   */
  private String mStringValue;

  private boolean isCorrect;

  private String mErrorDescription = "Текстовому полю необходимо задать значение";

/**
 * Декоратор на поле для контроля корректного ввода 
 * вещественных значений
 */
  private ControlDecoration mTextDecoration;

  /**
   * Последнее введенное значение до enable/disable
   */
  private String mLastText = mStringValue;
  //**************************************************************************//
  //                        Constructors                                      //
  //**************************************************************************//
  public TextFieldComposite(Composite parent, int style) {
    super(parent, style);
  }
  //**************************************************************************//
  //                        Getters                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Setters                                           //
  //**************************************************************************//


  //**************************************************************************//
  //                        Publics                                           //
  //**************************************************************************//
  @Override
  public void setFieldLayoutData(Object data) {
    super.setFieldLayoutData(data);
    mText.setLayoutData(data);
    layout();
  }

  @Override
  public boolean getFieldEnable() {
    return mText.isEnabled();
  }

  @Override
  public void setFieldEnable(boolean enable) {
    mText.setEnabled(enable);
	//чтобы сработал модифайЛистнер
	if (enable) {
		//для редактора, когда надо показать поля, для которых mLastText==null
		mText.setText( (mLastText!=null) ? mLastText : mStringValue);
	}
	else {
		setCorrect(true);
		mLastText = mText.getText();
		mText.setText(mLastText);
	}
  }


  @Override
  public void addFieldModifyListener(final ModifyListener listener) {
    mText.addModifyListener(new ModifyListener() {
      public void modifyText(ModifyEvent e) {
        e.data = TextFieldComposite.this;
        listener.modifyText(e);
      }
    });
  }

  /**
   * @return текущее строковое значение в поле ввода
   */
  public String getText() {
    String value = mText.getText();
    return value;
  }

  /**
   * задать в поле ввода новое текущее строковое значение
   */
  public void setText(String val) {
    if (val == null) {
    	val="";
//      return;
    }
    mStringValue = val;
    mText.setText(mStringValue);
  }

  //**************************************************************************//
  //                        Abstracts                                         //
  //**************************************************************************//

  //**************************************************************************//
  //                        Protected                                         //
  //**************************************************************************//
  @Override
  protected void createControls(Composite parent, int style) {
    mText = new Text(this, style | SWT.BORDER);
    mTextDecoration = createDecorator(mText);
    mText.addModifyListener(new ModifyListener() {
        public void modifyText(ModifyEvent evt) {
      	setCorrect(true);
        if (mText.isEnabled() && mText.getText().equals("")) {
        	setCorrect(false);
            }
        }
    });
  }
  
  @Override
	public Boolean isCorrect() {
		return isCorrect;
	}
  
  @Override
	public String getErrorDescription() {
		return mErrorDescription;
	}
  
  @Override
	protected ControlDecoration createDecorator(Control control) {
	  ControlDecoration c = super.createDecorator(control);
	  c.setDescriptionText(mErrorDescription);
	  return c;
	}
  //**************************************************************************//
  //                        Privates                                          //
  //**************************************************************************//

  private void setCorrect(boolean enable){
	  isCorrect = enable;
	  if (enable) {
		mTextDecoration.hide();
	  } else {
		mTextDecoration.show();
	  }
  }
  //**************************************************************************//
  //                        Public Statics                                    //
  //**************************************************************************//

  //**************************************************************************//
  //                        Private Statics                                   //
  //**************************************************************************//

  //**************************************************************************//
  //                        Internal Classes                                  //
  //**************************************************************************//
}
